package com.micro.frog.rbac.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.micro.frog.common.contants.Symbol;
import com.micro.frog.rbac.entity.RoleMenuDO;
import com.micro.frog.rbac.mapper.RoleMenuMapper;
import com.micro.frog.rbac.service.RoleMenuService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author :  ljh
 * @date : 2018/4/12
 **/
@Service
public class RoleMenuServiceImpl extends ServiceImpl<RoleMenuMapper, RoleMenuDO> implements RoleMenuService {

    @Override
    public List<Long> queryMenuIdsByRoleId(Long roleId) {
        List<Long> list = new ArrayList<>();
        RoleMenuDO roleMenu = new RoleMenuDO();
        roleMenu.setRoleId(roleId);
        List<RoleMenuDO> menus = this.queryList(roleMenu);
        for (RoleMenuDO menu : menus) {
            list.add(menu.getMenuId());
        }
        return list;
    }

    @Override
    public void addRoleMenus(Long roleId, List<Long> menuIds) {
        for (Long menuId : menuIds) {
            if (null != menuId) {
                RoleMenuDO userRole = new RoleMenuDO();
                userRole.setRoleId(roleId);
                userRole.setMenuId(menuId);
                this.save(userRole);
            }
        }
    }

    @Override
    @Transactional(rollbackFor = Throwable.class)
    public void updateRoleMenus(Long roleId, String menuIds) {
        this.deleteByRoleId(roleId);
        if (!StringUtils.isEmpty(menuIds)) {
            for (String menuId : menuIds.split(Symbol.COMA)) {
                if (null != menuId) {
                    RoleMenuDO userRole = new RoleMenuDO();
                    userRole.setRoleId(roleId);
                    userRole.setMenuId(Long.parseLong(menuId));
                    this.save(userRole);
                }
            }
        }
    }

    private void deleteByRoleId(Long roleId) {
        UpdateWrapper<RoleMenuDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("role_id", roleId);
        this.remove(updateWrapper);
    }

    @Override
    public List<RoleMenuDO> queryByRoleIds(List<Long> roleIds) {
        QueryWrapper<RoleMenuDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("role_id", roleIds);
        return this.list(queryWrapper);
    }

    @Override
    public List<RoleMenuDO> queryList(RoleMenuDO roleMenu) {
        QueryWrapper<RoleMenuDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.setEntity(roleMenu);
        return this.list(queryWrapper);
    }

    @Override
    public boolean add(RoleMenuDO roleMenu) {
        return this.save(roleMenu);
    }

    @Override
    public boolean update(RoleMenuDO roleMenu) {
        return this.updateById(roleMenu);
    }
}
